/*
 * \file MapAdaptateur.inl
 *
 * \author Thibaut ALGRIN
 * \author Emmanuel CARRE
 *
 * \version 1.0
 * \date 14 déc. 2011
 */

#include "ErreurCleAbsente.h"
#include "ErreurDictionnairePlein.h"

namespace tp3
{
	/*
	 * \brief Constructeur de la Classe MapAdaptateur
	 * \param unsigned int taille_maximale
	 * \fn MapAdaptateur(unsigned int taille_maximale)
	 */
	template<typename TypeCle, typename TypeValeur>
	MapAdaptateur<TypeCle, TypeValeur>::MapAdaptateur(unsigned int taille_maximale) :
	m_map(), m_taille_maximale(taille_maximale)
	{
	}
	/*
	 * \brief Méthode permettant d'afficher le contenue dont la clé est la même
	 * \param const TypeCle& cle
	 * \fn TypeValeur lire(const TypeCle& cle) const
	 * \return la valeur de l'element TypeValeur
	 */
	template<typename TypeCle, typename TypeValeur>
	TypeValeur MapAdaptateur<TypeCle, TypeValeur>::lire(const TypeCle& cle) const
	{
		//Nous évitons d'utiliser l'opérateur [] de map parce que cette méthode pour les dictionnaires
		//permet de faire des ajouts si la clé n'existe pas (cette méthode n'est donc pas const pour les
		//dictionnaires). Nous ne désirons pas ce comportement.
		typename std::map<TypeCle, TypeValeur>::const_iterator couple = m_map.find(cle);
		if (couple == m_map.end())
			{
				throw ErreurCleAbsente("La clé n'existe pas dans le dictionnaire.");
			}
		return couple->second;
	}
	/*
	 * \brief Méthode permettant de savoir si la table n'est pas vide
	 * \fn MapAdaptateur<TypeCle, TypeValeur>::nEstPasPlein() const
	 * \return true ou false
	 */
	template<typename TypeCle, typename TypeValeur>
	bool MapAdaptateur<TypeCle, TypeValeur>::nEstPasPlein() const
	{
		return m_map.size() < m_taille_maximale;
	}
	/*
	 * \brief Méthode permettant d'ajouter un élément
	 * \param const TypeCle& cle
	 * \param const TypeValeur& valeur
	 * \fn MapAdaptateur<TypeCle, TypeValeur>::ajouter(const TypeCle& cle, const TypeValeur& valeur)
	 * \post throw ErreurDictionnairePlein = si la clé n'existe pas
	 */
	template<typename TypeCle, typename TypeValeur>
	void MapAdaptateur<TypeCle, TypeValeur>::ajouter(const TypeCle& cle, const TypeValeur& valeur)
	{
		if (nEstPasPlein())
			{
				m_map.insert(std::pair<TypeCle, TypeValeur>(cle, valeur));
			}
		else
			{
				throw ErreurDictionnairePlein(
						"Aucun ajout ne peut être fait dans un dictionnaire déjà plein.");
			}
	}
	/*
	 * \brief Méthode permettant de lister tout les éléments
	 * \fn MapAdaptateur<TypeCle, TypeValeur>::listerElements() const
	 * \return EnsembleCouples<TypeCle, TypeValeur>
	 */
	template<typename TypeCle, typename TypeValeur>
	EnsembleCouples<TypeCle, TypeValeur> MapAdaptateur<TypeCle, TypeValeur>::listerElements() const
	{
		EnsembleCouples<TypeCle, TypeValeur> elements(m_map.begin(), m_map.end());
		return elements;
	}

}
